home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / viewers / mpgplyr1.lha / src / video.h < prev   
C/C++ Source or Header  |  1992-12-08  |  12KB  |  321 lines

  1. /*
  2.  * Copyright (c) 1992 The Regents of the University of California.
  3.  * All rights reserved.
  4.  * 
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice and the following
  8.  * two paragraphs appear in all copies of this software.
  9.  * 
  10.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  13.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  * 
  15.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  */
  21. #include <stdio.h>
  22. #include <setjmp.h>
  23.  
  24. #include <X11/Xlib.h>
  25. #include <X11/Xutil.h>
  26.  
  27. #ifdef SH_MEM
  28. #include <sys/ipc.h>
  29. #include <sys/shm.h>
  30. #include <X11/extensions/XShm.h>
  31. #endif
  32.  
  33. /* Define Parsing error codes. */
  34.  
  35. #define SKIP_PICTURE -10
  36. #define SKIP_TO_START_CODE -1
  37. #define PARSE_OK 1
  38.  
  39. /* Define BOOLEAN, TRUE, and FALSE. */
  40.  
  41. #define BOOLEAN int
  42. #define TRUE 1
  43. #define FALSE 0
  44.  
  45. /* Set ring buffer size. */
  46.  
  47. #define RING_BUF_SIZE 5
  48.  
  49. /* Macros for picture code type. */
  50.  
  51. #define I_TYPE 1
  52. #define P_TYPE 2
  53. #define B_TYPE 3
  54.  
  55. /* Start codes. */
  56.  
  57. #define SEQ_END_CODE 0x000001b7
  58. #define SEQ_START_CODE 0x000001b3
  59. #define GOP_START_CODE 0x000001b8
  60. #define PICTURE_START_CODE 0x00000100
  61. #define SLICE_MIN_START_CODE 0x00000101
  62. #define SLICE_MAX_START_CODE 0x000001af
  63. #define EXT_START_CODE 0x000001b5
  64. #define USER_START_CODE 0x000001b2
  65.  
  66. /* Number of macroblocks to process in one call to mpegVidRsrc. */
  67.  
  68. #define MB_QUANTUM 100
  69.  
  70. /* Macros used with macroblock address decoding. */
  71.  
  72. #define MB_STUFFING 34
  73. #define MB_ESCAPE 35
  74.  
  75. /* Lock flags for pict images. */
  76.  
  77. #define DISPLAY_LOCK 0x01
  78. #define PAST_LOCK 0x02
  79. #define FUTURE_LOCK 0x04
  80.  
  81. #define HYBRID_DITHER 0
  82. #define HYBRID2_DITHER 1
  83. #define FS4_DITHER 2
  84. #define FS2_DITHER 3
  85. #define FS2FAST_DITHER 4
  86. #define Twox2_DITHER 5
  87. #define GRAY_DITHER 6
  88. #define FULL_COLOR_DITHER 7
  89. #define NO_DITHER 8
  90. #define ORDERED_DITHER 9
  91. #define MONO_DITHER 10
  92. #define MONO_THRESHOLD 11
  93.  
  94. /* External declaration of row,col to zig zag conversion matrix. */
  95.  
  96. extern int scan[][8];
  97.  
  98. /* Temporary definition of time stamp structure. */
  99.  
  100. typedef int TimeStamp;
  101.  
  102. /* Structure with reconstructed pixel values. */
  103.  
  104. typedef struct pict_image {
  105.   unsigned char *luminance;              /* Luminance plane.   */
  106.   unsigned char *Cr;                     /* Cr plane.          */
  107.   unsigned char *Cb;                     /* Cb plane.          */
  108.   unsigned char *display;                /* Display plane.     */
  109.   int locked;                            /* Lock flag.         */
  110.   TimeStamp show_time;                   /* Presentation time. */
  111.  
  112. #ifdef SH_MEM
  113.   XShmSegmentInfo shminfo;               /* Segment info.  */
  114.   XImage *ximage;                        /* Ximage struct. */
  115. #endif
  116.  
  117. } PictImage;
  118.  
  119. /* Group of pictures structure. */
  120.  
  121. typedef struct GoP {
  122.   BOOLEAN drop_flag;                     /* Flag indicating dropped frame. */
  123.   unsigned int tc_hours;                 /* Hour component of time code.   */
  124.   unsigned int tc_minutes;               /* Minute component of time code. */
  125.   unsigned int tc_seconds;               /* Second component of time code. */
  126.   unsigned int tc_pictures;              /* Picture counter of time code.  */
  127.   BOOLEAN closed_gop;                    /* Indicates no pred. vectors to
  128.                         previous group of pictures.    */
  129.   BOOLEAN broken_link;                   /* B frame unable to be decoded.  */
  130.   char *ext_data;                        /* Extension data.                */
  131.   char *user_data;                       /* User data.                     */
  132. } GoP;
  133.  
  134. /* Picture structure. */
  135.  
  136. typedef struct pict {
  137.   unsigned int temp_ref;                 /* Temporal reference.             */
  138.   unsigned int code_type;                /* Frame type: P, B, I             */
  139.   unsigned int vbv_delay;                /* Buffer delay.                   */
  140.   BOOLEAN full_pel_forw_vector;          /* Forw. vectors specified in full
  141.                         pixel values flag.              */
  142.   unsigned int forw_r_size;              /* Used for vector decoding.       */
  143.   unsigned int forw_f;                   /* Used for vector decoding.       */
  144.   BOOLEAN full_pel_back_vector;          /* Back vectors specified in full 
  145.                         pixel values flag.              */
  146.   unsigned int back_r_size;              /* Used in decoding.               */
  147.   unsigned int back_f;                   /* Used in decoding.               */
  148.   char *extra_info;                      /* Extra bit picture info.         */
  149.   char *ext_data;                        /* Extension data.                 */
  150.   char *user_data;                       /* User data.                      */
  151. } Pict;
  152.  
  153. /* Slice structure. */
  154.  
  155. typedef struct slice {
  156.   unsigned int vert_pos;                 /* Vertical position of slice. */
  157.   unsigned int quant_scale;              /* Quantization scale.         */
  158.   char *extra_info;                      /* Extra bit slice info.       */
  159. } Slice;
  160.  
  161. /* Macroblock structure. */
  162.  
  163. typedef struct macroblock {
  164.   int mb_address;                        /* Macroblock address.              */
  165.   int past_mb_addr;                      /* Previous mblock address.         */
  166.   int motion_h_forw_code;                /* Forw. horiz. motion vector code. */
  167.   unsigned int motion_h_forw_r;          /* Used in decoding vectors.        */
  168.   int motion_v_forw_code;                /* Forw. vert. motion vector code.  */
  169.   unsigned int motion_v_forw_r;          /* Used in decdoinge vectors.       */
  170.   int motion_h_back_code;                /* Back horiz. motion vector code.  */
  171.   unsigned int motion_h_back_r;          /* Used in decoding vectors.        */
  172.   int motion_v_back_code;                /* Back vert. motion vector code.   */
  173.   unsigned int motion_v_back_r;          /* Used in decoding vectors.        */
  174.   unsigned int cbp;                      /* Coded block pattern.             */
  175.   BOOLEAN mb_intra;                      /* Intracoded mblock flag.          */
  176.   BOOLEAN bpict_past_forw;               /* Past B frame forw. vector flag.  */
  177.   BOOLEAN bpict_past_back;               /* Past B frame back vector flag.   */
  178.   int past_intra_addr;                   /* Addr of last intracoded mblock.  */
  179.   int recon_right_for_prev;              /* Past right forw. vector.         */
  180.   int recon_down_for_prev;               /* Past down forw. vector.          */
  181.   int recon_right_back_prev;             /* Past right back vector.          */
  182.   int recon_down_back_prev;              /* Past down back vector.           */
  183. } Macroblock;
  184.  
  185. /* Block structure. */
  186.  
  187. typedef struct block {
  188.   short int dct_recon[8][8];             /* Reconstructed dct coeff matrix. */
  189.   short int dct_dc_y_past;               /* Past lum. dc dct coefficient.   */
  190.   short int dct_dc_cr_past;              /* Past cr dc dct coefficient.     */
  191.   short int dct_dc_cb_past;              /* Past cb dc dct coefficient.     */
  192. } Block;
  193.  
  194. /* Video stream structure. */
  195.  
  196. typedef struct vid_stream {
  197.   unsigned int h_size;                         /* Horiz. size in pixels.     */
  198.   unsigned int v_size;                         /* Vert. size in pixels.      */
  199.   unsigned int mb_height;                      /* Vert. size in mblocks.     */
  200.   unsigned int mb_width;                       /* Horiz. size in mblocks.    */
  201.   unsigned char aspect_ratio;                  /* Code for aspect ratio.     */
  202.   unsigned char picture_rate;                  /* Code for picture rate.     */
  203.   unsigned int bit_rate;                       /* Bit rate.                  */
  204.   unsigned int vbv_buffer_size;                /* Minimum buffer size.       */
  205.   BOOLEAN const_param_flag;                    /* Contrained parameter flag. */
  206.   unsigned char intra_quant_matrix[8][8];      /* Quantization matrix for
  207.                           intracoded frames.         */
  208.   unsigned char non_intra_quant_matrix[8][8];  /* Quanitization matrix for 
  209.                           non intracoded frames.     */
  210.   char *ext_data;                              /* Extension data.            */
  211.   char *user_data;                             /* User data.                 */
  212.   GoP group;                                   /* Current group of pict.     */
  213.   Pict picture;                                /* Current picture.           */
  214.   Slice slice;                                 /* Current slice.             */
  215.   Macroblock mblock;                           /* Current macroblock.        */
  216.   Block block;                                 /* Current block.             */
  217.   int state;                                   /* State of decoding.         */
  218.   int bit_offset;                              /* Bit offset in stream.      */
  219.   unsigned int *buffer;                        /* Pointer to next byte in
  220.                           buffer.                    */
  221.   int buf_length;                              /* Length of remaining buffer.*/
  222.   unsigned int *buf_start;                     /* Pointer to buffer start.   */
  223.   int max_buf_length;                          /* Max lenght of buffer.      */
  224.   PictImage *past;                             /* Past predictive frame.     */
  225.   PictImage *future;                           /* Future predictive frame.   */
  226.   PictImage *current;                          /* Current frame.             */
  227.   PictImage *ring[RING_BUF_SIZE];              /* Ring buffer of frames.     */
  228. } VidStream;   
  229.  
  230. /* Declaration of global pointer to current video stream. */
  231.  
  232. extern VidStream *curVidStream;
  233.  
  234. /* Declarataion of global display pointer. */
  235. extern Display *display;
  236.  
  237. /* Shared memory flag. */
  238. extern int shmemFlag;
  239.  
  240. /* Definition of Contant integer scale factor. */
  241.  
  242. #define CONST_BITS 13
  243.  
  244. /* Declaration of functions. */
  245.  
  246. extern void correct_underflow();
  247. extern void DecodeMBTypeI();
  248. extern void DecodeMBTypeP();
  249. extern void DecodeMBTypeB();
  250. extern void DecodeCBP();
  251. extern void ComputeForwVector();
  252. extern void ComputeBackVector();
  253. extern int ParseReconBlock();
  254. extern int ParseAwayBlock();
  255. extern void j_rev_dct();
  256. extern void ToggleBFlag();
  257. extern void TogglePFlag();
  258. extern void DoDitherImage();
  259. extern void ExecuteDisplay();
  260. extern int get_more_data();
  261. extern void init_tables();
  262. extern void InitFS2Dither();
  263. extern void FS2DitherImage();
  264. extern void InitFS2FastDither();
  265. extern void FS2FastDitherImage();
  266. extern void InitFS4Dither();
  267. extern void FS4DitherImage();
  268. extern void InitHybridDither();
  269. extern void HybridDitherImage();
  270. extern void InitOrderedDither();
  271. extern void OrderedDitherImage();
  272. extern void InitHybridErrorDither();
  273. extern void HybridErrorDitherImage();
  274. extern void Init2x2Dither();
  275. extern void PostInit2x2Dither();
  276. extern void Twox2DitherImage();
  277. extern void InitColorDither();
  278. extern void ColorDitherImage();
  279. extern void InitColor();
  280. extern void GrayDitherImage();
  281. extern void MonoDitherImage();
  282. extern void MonoThresholdImage();
  283. extern void InitDisplay();
  284. extern void InitGrayDisplay();
  285. extern void InitMonoDisplay();
  286. extern void InitColorDisplay();
  287. extern void ResizeDisplay();
  288. extern void DestroyVidStream();
  289. extern void DestroyPictImage();
  290. extern void decodeDCTCoeffFirst();
  291. extern void decodeDCTCoeffNext();
  292. #ifdef SH_MEM
  293. extern void InstallXErrorHandler();
  294. extern void DeInstallXErrorHandler();
  295. extern int gXErrorFlag;
  296. #endif
  297. extern double realTimeStart;
  298. extern double ReadSysClock();
  299. extern int totNumFrames;
  300. extern int loopFlag;
  301. extern jmp_buf env;
  302.  
  303. #ifdef ANALYSIS
  304. extern unsigned int bitCount;
  305. extern int showEachFlag;
  306. extern void PrintAllStats();
  307. extern unsigned int cacheHit[8][8];
  308. extern unsigned int cacheMiss[8][8];
  309. #endif
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.